/**
 * 
 */
package com.mixsmart.core.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mixsmart.core.bean.Paginate;
import com.mixsmart.core.bean.entity.IEntityBean;
import com.mixsmart.core.dao.IBaseEntityDao;
import com.mixsmart.spellsql.ICondition;
import com.mixsmart.utils.CollectionUtils;
import com.mixsmart.utils.LoggerUtils;
import com.mixsmart.utils.StringUtils;

/**
 * 实体DAO的实现类
 * @author lmq
 * @version 1.0
 * @since JDK版本大于等于1.6
 * 2015年12月28日
 * @param <T>
 * @param <PK>
 */
public abstract class BaseEntityDao<T extends IEntityBean, PK extends Serializable> extends BaseDao implements IBaseEntityDao<T, PK> {

	private static final Logger logger = LoggerFactory.getLogger(BaseEntityDao.class);
	
	@Override
	public boolean delete(T t) {
		// TODO 实现IDeleteEntityDao中的方法
		if(null == t) {
			return false;
		}
		LoggerUtils.debug(logger, "删除数据["+t.toString()+"]");
		super.getSession().delete(t);
		LoggerUtils.debug(logger, "删除数据--成功");
		return true;
	}

	@Override
	public boolean delete(PK id) {
		// TODO 实现IDeleteEntityDao中的方法
		return this.delete(entityClass, id);
	}

	@Override
	public boolean delete(PK[] ids) {
		// TODO 实现IDeleteEntityDao中的方法
		return this.delete(entityClass, ids);
	}

	@Override
	public boolean delete(Class<? extends IEntityBean> clazz, PK id) {
		// TODO 实现IDeleteEntityDao中的方法
		boolean is = false;
		if(null == id || null == clazz) {
			return is;
		}
		LoggerUtils.debug(logger, "删除数据["+id.toString()+"]");
		Object bean = find(clazz, id);
		if(null != bean) {
			super.getSession().delete(bean);
			is = true;
			LoggerUtils.debug(logger, "删除数据--成功");
		} else {
			LoggerUtils.error(logger, "删除数据--失败[数据不存在]");
		}
		return is;
	}

	@Override
	public boolean delete(Class<? extends IEntityBean> clazz, PK[] ids) {
		// TODO 实现IDeleteEntityDao中的方法
		boolean is = false;
		if(null != clazz && null != ids && ids.length>0) {
			for (PK id : ids) {
				this.delete(clazz, id);
			}
			is = true;
		}
		return is;
	}

	@Override
	public boolean delete(ArrayList<T> ts) {
		// TODO 实现IDeleteEntityDao中的方法
		boolean is = false;
		LoggerUtils.debug(logger, "批量删除数据");
		if(CollectionUtils.isNotEmpty(ts)) {
			Session session = super.getSession();
			for (T t : ts) {
				session.delete(t);
			}
			LoggerUtils.debug(logger, "批量删除数据--成功");
			is = true;
		} else {
			LoggerUtils.error(logger, "批量删除数据--失败[列表为空]");
		}
		return is;
	}

	@Override
	public boolean delete(ICondition condition) {
		// TODO 实现IDeleteEntityDao中的方法
		return super.delete(entityClass, condition);
	}

	@Override
	public boolean deleteHql(String hql, HashMap<String, Object> params) {
		// TODO 实现IDeleteEntityDao中的方法
		return super.executeHQL(hql, params, false);
	}

	@Override
	public boolean deleteHqlFilter(String hql, HashMap<String, Object> params) {
		// TODO 实现IDeleteEntityDao中的方法
		return super.executeHQL(hql, params, true);
	}

	@SuppressWarnings("unchecked")
	@Override
	public T find(PK id) {
		// TODO 实现IQueryEntityDao中的方法
		LoggerUtils.debug(logger, "按ID[" + id.toString() + "]查询数据...");
		T t = null;
		if (null != id) {
			t = (T) super.getSession().get(entityClass, id);
		}
		return t;
	}

	@SuppressWarnings("unchecked")
	@Override
	public <E> E find(Class<? extends IEntityBean> clazz, PK id) {
		// TODO 实现IQueryEntityDao中的方法
		LoggerUtils.debug(logger, "按ID[" + id.toString() + "]查询数据...");
		E bean = null;
		if (null != id && null != clazz) {
			bean = (E) super.getSession().get(clazz, id);
		}
		return bean;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> findAll() {
		// TODO 实现IQueryEntityDao中的方法
		List<T> list = super.getSession().createCriteria(entityClass).list();
		return CollectionUtils.handleNull(list);
	}

	@Override
	public T find(ICondition condition) {
		// TODO 实现IQueryEntityDao中的方法
		return super.findUnique(entityClass, condition);
	}

	@Override
	public List<T> finds(ICondition condition) {
		// TODO 实现IQueryEntityDao中的方法
		return super.finds(entityClass, condition);
	}

	@Override
	public Paginate<T> finds(ICondition condition, int pageNo, int pageSize) {
		// TODO 实现IQueryEntityDao中的方法
		return super.finds(entityClass, condition, pageNo, pageSize);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> queryHql(String hql, HashMap<String, Object> params) {
		// TODO 实现IQueryEntityDao中的方法
		return CollectionUtils.handleNull(super.getQuery(hql, params, false, false).list());
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<T> queryHqlFilter(String hql, HashMap<String, Object> params) {
		// TODO 实现IQueryEntityDao中的方法
		return CollectionUtils.handleNull(super.getQuery(hql, params, false, true).list());
	}

	@Override
	public Paginate<T> queryHql(String hql, HashMap<String, Object> params, int pageNo, int pageSize) {
		// TODO 实现IQueryEntityDao中的方法
		return this.commonHandlePage(hql, params, pageNo, pageSize, null, 
				this.getTotalCount(hql, params, false), false, false);
	}

	@Override
	public Paginate<T> queryHqlFilter(String hql, HashMap<String, Object> params, int pageNo, int pageSize) {
		// TODO 实现IQueryEntityDao中的方法
		return this.commonHandlePage(hql, params, pageNo, pageSize, null, 
				this.getTotalCount(hql, params, true), false, true);
	}

	@Override
	public Long count(ICondition condition) {
		// TODO 实现IQueryEntityDao中的方法
		LoggerUtils.debug(logger, "按条件统计数据...");
		HashMap<String, Object> params = null;
		String hql = " from " + entityClass.getName();
		if (null != condition) {
			hql += " " + condition.build();
			params = condition.param();
		}
		LoggerUtils.debug(logger, "条件统计HQL[" + hql + "]");
		return super.countHql(prepareCount(hql), params);
	}
	
	@Override
	public boolean save(T t) {
		// TODO 实现ISaveEntityDao中的方法
		return super.saveObj(t);
	}

	@Override
	public boolean save(ArrayList<T> ts) {
		// TODO 实现ISaveEntityDao中的方法
		return super.saveObj(ts);
	}

	@Override
	public boolean saveOrUpdate(T t) {
		// TODO 实现ISaveEntityDao中的方法
		if(null == t ) 
			return false;
		LoggerUtils.debug(logger, "保存或更新数据["+t.toString()+"]");
		super.getSession().saveOrUpdate(t);
		LoggerUtils.debug(logger, "保存或更新数据--成功");
		return true;
	}

	@Override
	public boolean update(T t) {
		// TODO 实现IUpdateEntityDao中的方法
		return super.updateObj(t);
	}

	@Override
	public boolean update(ArrayList<T> ts) {
		// TODO 实现IUpdateEntityDao中的方法
		return super.updateObj(ts);
	}

	@Override
	public boolean updateHql(String hql, HashMap<String, Object> params) {
		// TODO 实现IUpdateEntityDao中的方法
		return super.executeHQL(hql, params, false);
	}

	@Override
	public boolean updateHqlFilter(String hql, HashMap<String, Object> params) {
		// TODO 实现IUpdateEntityDao中的方法
		return super.executeHQL(hql, params, true);
	}

	@SuppressWarnings("unchecked")
	@Override
	public <E> E queryEntityBySql(String sql, HashMap<String, Object> params, Class<? extends IEntityBean> clazz) {
		StringUtils.isAssert(clazz, "clazz参数为空");
		SQLQuery sqlQuery = (SQLQuery)getQuery(sql, params, true, false);
		sqlQuery.addEntity(clazz);
		return (E) sqlQuery.uniqueResult();
	}

	@SuppressWarnings("unchecked")
	@Override
	public <E> List<E> queryEntitysBySql(String sql, HashMap<String, Object> params, Class<? extends IEntityBean> clazz) {
		StringUtils.isAssert(clazz, "clazz参数为空");
		SQLQuery sqlQuery = (SQLQuery)getQuery(sql, params, true, false);
		sqlQuery.addEntity(clazz);
		return sqlQuery.list();
	}

	@Override
	public <E> Paginate<E> queryEntitysBySql(String sql, HashMap<String, Object> params, Class<? extends IEntityBean> clazz,
			int pageNo, int pageSize) {
		StringUtils.isAssert(clazz, "clazz参数为空");
		return super.commonHandlePage(sql, params, pageNo, pageSize, clazz, 
				super.getTotalCount(sql, params, false), false);
	}

	@SuppressWarnings("unchecked")
	@Override
	public <E> List<E> queryEntitysBySqlFilter(String sql,
			HashMap<String, Object> params, Class<? extends IEntityBean> clazz) {
		StringUtils.isAssert(clazz, "clazz参数为空");
		SQLQuery sqlQuery = (SQLQuery)getQuery(sql, params, true, true);
		sqlQuery.addEntity(clazz);
		return sqlQuery.list();
	}

	@Override
	public <E> Paginate<E> queryEntitysBySqlFilter(String sql,
			HashMap<String, Object> params, Class<? extends IEntityBean> clazz,
			int pageNo, int pageSize) {
		StringUtils.isAssert(clazz, "clazz参数为空");
		return super.commonHandlePage(sql, params, pageNo, pageSize, clazz, 
				super.getTotalCount(sql, params, true), true);
	}
	
}
